package com.fhao.principle.config;

import com.fhao.principle.model.Dog;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.web.context.annotation.ApplicationScope;
import org.springframework.web.context.annotation.RequestScope;
import org.springframework.web.context.annotation.SessionScope;

/**
 * Bean 的作用域
 */

@Configuration
public class DogConfig {
    //默认是单例 (即 无论 new多少次都是同一个对象.)
    @Bean
    public Dog dog() {
        Dog dog = new Dog();
        dog.setName("小黄");
        return dog;
    }

    //设置为单例模式
    @Bean
    @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
    public Dog singletonDog() {
        return new Dog();
    }

    //设置为原型作用域(多例作用域), 每次获取的bean对象都不同
    @Bean
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public Dog prototypeDog() {
        return new Dog();
    }

    //单个 Bean 定义的范围限定为单个 HTTP 请求的生命周期
    //简单来说就是不同的 http 请求得到的 bean 对象不同
    @Bean
    @RequestScope
    public Dog requestDog() {
        return new Dog();
    }

    //单个 Bean 定义的范围限定为 HTTP 的生命周期。
    //同一个浏览器访问 拿到的 bean 对象相同, 不同 浏览器则不同.
    @Bean
    @SessionScope
    public Dog sessionDog() {
        return new Dog();
    }

    //将单个 Bean 定义的范围限定为 .仅在以下地区有效 Web 感知 Spring 的上下文。ServletContextApplicationContext
    //和 singleton 相似 不同浏览器拿到的 bean 对象 也是相同的.
    // 区别就在于 如果 ServletContextApplicationContext 中 只有一个 ApplicationContext, 那么两者就是一样的, 如果有多个,那就不一样.
    @Bean
    @ApplicationScope
    public Dog applicationDog() {
        return new Dog();
    }
}








